#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tp2.h"

/*o tamanho das sk tao td igual...
  pra facilitar um pouco(Muito!)..
  se precisar fikar cada sk com seu tamanho certo fudeu!=D
 */

  void fileseek(FILE *arq, int steps, int tamsk){
    if(tamsk==200){
      fseek(arq,steps*450,0);
    }
    if(tamsk==100){
      fseek(arq,(steps*450)+200,0);
    }
    if(tamsk==125){
      fseek(arq,(steps*450)+300,0);
    }
    if(tamsk==4){
      fseek(arq,(steps*450)+425,0);
    }
  }

  PK* CarregaSKDaBase(int *nu, int *nulista, FILE *base, int tamsk, FILE *listainvertida){
    int i=0,a=0,b=0,nsk=0,nlista=0, a1=0;
    char buffer[200],verifica[200];
    PK *found,aux,*listask;
    listask=(PK*)malloc(20*sizeof(PK));
    while(fgets(buffer,tamsk,base)!=NULL){
      while(b<200){
        buffer[b]=' ';
        b++;
      }
      b=0;
      fileseek(base,i,tamsk);
      fread(buffer,1,tamsk,base);
      while((buffer[a]!=' ')&&(a<tamsk)){
	while((buffer[a]!=' ')&&(a<tamsk)){
          verifica[a1]=buffer[a];
          //printf("teste do buffer %c\n",buffer[a]);
          a++;
          a1++;
        }
        b=a1;
        a++;
        a1=0;
        while(b<200){
	  verifica[b]=' ';
          b++;
        }
        if(nsk>0){
	  found=BSearch(listask,verifica,0,nsk-1);
	}
        else{
          found=NULL;
        }
        if(found==NULL){
          //printf("N Encontrou\n");
	  for(b=0;b<200;b++){
	    aux.titulo[b]=buffer[b];
          }
          aux.NRR=-1;
          //printf("teste do aux null %d\n",aux.NRR);
          fseek(listainvertida,nlista*204,0);
          fwrite(&aux,1,sizeof(PK),listainvertida);
	  nlista++;
          nsk++;
          //printf("teste do nlista null %d\n",nlista);
          //printf("teste do nsk null %d\n",nsk);
          //printf("Add sk numero %d\n",nsk);
          //AdicionaPK(listask,verifica,nlista);
          for(b=0;b<200;b++){
            listask[nsk-1].titulo[b]=verifica[b];
          }
          listask[nsk-1].NRR=nlista-1;
          if(nsk%20==0){
            listask=(PK*)realloc(listask,(nsk+20)*sizeof(PK));
          }
          Ordena(listask,0,nsk-1);
	}
        else{
          //printf("Encontrou\n");
	  for(b=0;b<200;b++){
	    aux.titulo[b]=buffer[b];
          }
	  aux.NRR=found->NRR;
          //printf("teste do aux nao null %d\n",aux.NRR);
	  fseek(listainvertida,nlista*204,0);
 	  fwrite(&aux,1,sizeof(PK),listainvertida);
          found->NRR=nlista;
	  nlista++;
          //printf("teste do nlista n null %d\n",nlista);
          //printf("teste do nsk n null %d\n",nsk);
  	}
    }
    b=0;
    i++;
    a=0;
  }
          //printf("teste do nsk final %d\n",nsk);
  *nu=nsk;
  *nulista=nlista;
  return listask;
}

  PK* CarregaSK(FILE *SKlist, int *nSK){
    int n, NRR, i=0;
    char buffer[200];
    PK *list;
    list=(PK*)malloc(20*sizeof(PK));
    while(feof(SKlist)==0){
      fread(&n,1,4,SKlist);
      fread(buffer,1,n,SKlist);
      while(n<200){
        buffer[n]=' ';
        n++;
      }
      fread(&NRR,1,4,SKlist);
      for(n=0;n<200;n++){
        list[i].titulo[n]=buffer[n];
      }
      list[i].NRR=NRR;
      i++;
      if(i%20==0){
        list=(PK*)realloc(list,(i+20)*sizeof(PK));
      }
    }
    (*nSK)=i;
    return list;
  }
